<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大。

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息。Promise 提供统一的 API，各种异步操作都可以用同样的方法进行处理。


    // 如何创建Promise对象(实例化对象) -> 通过构造函数创建

    // var p = new Promise(function () {
    //     // Promise接受一个回调函数 -> 容器 -> 一般用来执行一段代码(通常是异步操作 ,同步也可以)

    // });
    // console.log(p);  // {<pending>:undefined}

    // {
    //     [[PromiseState]]:"pending",   Promise的状态
    //     [[PromiseResult]]:undefined   Promise的结果(在状态改变可以存储一些数据)
    // }


    // Promise的状态:
    // pending    (进行中)
    // fulfilled  (已成功)
    // rejected   (已失败)

    // 如何改变Promise对象的状态  => [[PromiseState]]私有属性,只能借助官方给定方法更改
    // resolve()  将Promise对象的状态 由 pending(进行中) 变为 fulfilled(已成功)
    // reject()  将Promise对象的状态 由 pending(进行中) 变为 rejected (已失败)

    // resolve()  reject() 除了改变状态,还可以接收一个参数 作为Promise对象的结果存储


    // 同步代码 -> 立即改变状态
    // var p = new Promise(function (resolve, reject) {
    //     // Promise接收一个回调函数 -> 容器 -> 一般用来执行一段代码(通常是异步操作 ,同步也可以)
    //     // 注意: Promise接收一个回调函数 => 同步任务 => new Promise() 调用时立即执行

    //     console.log("回调函数开始执行");

    //     // resolve(1);   // {<fulfilled>:1}
    //     reject(2);   // {<rejected>:2}


    // });
    // console.log(p);



    // Promise的特征:
    // 1. 对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。[[PromiseState]]私有属性,只能借助官方给定方法更改  => 用户根据异步操作的结果自行

    // 2. 一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）

    // 注意，为了行文方便，本章后面的resolved统一只指fulfilled状态，不包含rejected状态。


    // 异步代码  => 未来改变状态

    // debugger;
    var p = new Promise(function (resolve, reject) {
        // Promise接收一个回调函数 -> 容器 -> 一般用来执行一段代码(通常是异步操作 ,同步也可以)
        // 注意: Promise接收一个回调函数 => 同步任务 => new Promise() 调用时立即执行

        console.log("回调函数开始执行");

        setTimeout(function () {
            // debugger;
            // 投一个硬币  -> 模拟是否拖堂

            // var num = Math.random(); // [0,1)
            // console.log("异步代码开始执行:", num);
            // if (num >= 0.5) {
            //     // resolve("正面"); //  {<fulfilled>:"正面"}
            // } else {
            //     // reject("反面");  // {<reject>:"反面"}
            // }

            reject(2);    // {<rejected>:2}
            resolve(1);   // {<fulfilled>:1}

            console.log("94", p);

        }, 2000)


    });
    console.log("87:", p);  //{<pending>:undefined}


    // 可以理解为: Promise状态机器  -> 对应异步操作的不同的流程改变状态 (pending  fulfilled rejected)







</script>

</html>